###
### 斋藤康毅的《深度学习进阶》
### 神经网络的层实现：
### （1）所有的层都有 forward() 方法和 backward() 方法
### （2）所有的层都有 params 和 grads 实例变量
### forward表示正向传播，backward表示反向传播
###

import numpy as np

'''
Sigmoid 激活函数
'''
class Sigmoid:
    def __init__(self):
        self.params = []
    def forward(self, x):
        return 1 / (1 + np.exp(-x))
    
'''
Affine 层
注意参数W表示权重，b表示偏置
W 表示权重矩阵（这个矩阵的形式和x的表示形式的选择是有关），b 表示偏置向量
'''
class Affine:
    def __init__(self, W, b):
        self.params = [W, b]
    def forward(self, x):
        W, b = self.params
        out = np.dot(x, W) + b
        return out
    
class TwoLayerNet:
    def __init__(self, input_size, hidden_size, output_size):
        I, H, O = input_size, hidden_size, output_size

        #
        W1 = np.random.randn(I, H)
        b1 = np.random.randn(H)
        W2 = np.random.randn(H, O)
        b2 = np.random.randn(O)
        #
        self.layers = [
            Affine(W1, b1),
            Sigmoid(),
            Affine(W2, b2)
        ]

        #将所有的权重整理到列表中
        self.params = []
        for layer in self.layers:
            self.params += layer.params

    def predict(self, x):
        for layer in self.layers:
            x = layer.forward(x)
        return x
    


x = np.random.randn(10, 2)
model = TwoLayerNet(2, 4, 3)
s = model.predict(x)
print(s)
